package tp.pr5;

import java.util.ArrayList;

public class Map extends tp.pr5.Observable<MapObserver>
{

	private ArrayList<Door> mapa = new ArrayList<Door>();
	private Room currentRoom;

	// constructor
	public Map(Room initRoom)
	{
		this.mapa = new ArrayList<Door>();
		this.currentRoom = initRoom;
		// Entramos en el primer cuarto

	}

	// De game, referente a room

	public Room getCurrentRoom()
	{
		return this.currentRoom;
	}

	public void setCurrentRoom(Room nuevoCuarto)
	{
		Room previousRoom = this.currentRoom;
		Door aux = null;
		Directions dir = null;
		for (int i = 0; i < this.mapa.size(); i++)
		{
			aux = this.mapa.get(i);
			if (aux.connect(previousRoom, nuevoCuarto)) {
				if (aux.getBidi()) {
					if (aux.isInRoom(previousRoom, aux.getDir())) {
						dir=aux.getDir();
					}
					else dir=aux.getDir().getOpuesto();
				}
				else if (aux.getOrigen()==previousRoom && aux.getDestino()==nuevoCuarto) {
					dir=aux.getDir();
				}
				
				
			}

		}

		this.currentRoom = nuevoCuarto;
		if (previousRoom != nuevoCuarto)
			for (MapObserver observadorMapa : this._observer)
				observadorMapa.roomEntered(dir, nuevoCuarto);
	//	this.playerExamineRoom();
	}

	// metodos

	public void addDoor(Door d)
	{
		mapa.add(d);
	}

	public Door addDoor(Room source, Directions direction, Room target) // puerta
																								// normal
	{
		Door puerta = new Door(source, direction, target, false);
		mapa.add(puerta);
		return puerta;
	}

	public Door addBidirectionalDoor(Room source, Directions direction,
			Room target) // puerta bidireccional
	{
		Door puerta = new Door(source, direction, target, true);
		mapa.add(puerta);
		return puerta;
	}

	public Door getDoor(Room room, Directions dir)

	{
		Door puerta = null;
		Door aux = puerta;
		int i = 0;

		while (i < this.mapa.size())
		{
			aux = mapa.get(i);
			if (aux.getOrigen() == room && aux.getDir() == dir)
			{
				puerta = aux;
			}

			if (aux.getDestino() == room && aux.getDir().getOpuesto() == dir)
			{
				puerta = aux;
			}
			i++;
		}

		return puerta;
	}

	public Door getDoor(Door d)
	{
		for (int i = 0; i < this.mapa.size(); i++)
		{
			if (d.equals(this.mapa.get(i)))
			{
				return this.mapa.get(i);
			}
		}
		return null;

	}

	public void playerExamineRoom()
	{
		for (MapObserver marujon : _observer)
			marujon.playerHasExaminedRoom(getCurrentRoom());
	}

	// TODO falta una roomentered para quitar mapcell
	// Requests the player wants to examine a room

}